#ifndef __USART_DMA_H__
#define __USART_DMA_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_uart.h"
#include "stm32f4xx_hal_dma.h"
#include <stdbool.h>
#include <stdint.h>
#include "FreeRTOS.h"
#include "semphr.h"
#include "task.h"

// 环形缓冲区结构
typedef struct {
    uint8_t *buffer;
    uint32_t head;
    uint32_t tail;
    uint32_t size;
    uint32_t count;
} ring_buffer_t;

// 串口配置结构体
typedef struct {
    USART_TypeDef *USARTx;           // 串口实例
    uint32_t baudrate;               // 波特率
    
    // DMA配置
    DMA_Stream_TypeDef *dma_rx_stream;  // RX DMA流
    uint32_t dma_rx_channel;            // RX DMA通道
    DMA_Stream_TypeDef *dma_tx_stream;  // TX DMA流
    uint32_t dma_tx_channel;            // TX DMA通道
    
    // GPIO配置
    GPIO_TypeDef *tx_gpio_port;      // TX GPIO端口
    uint16_t tx_gpio_pin;            // TX GPIO引脚
    uint32_t tx_gpio_af;             // TX复用功能
    GPIO_TypeDef *rx_gpio_port;      // RX GPIO端口
    uint16_t rx_gpio_pin;            // RX GPIO引脚
    uint32_t rx_gpio_af;             // RX复用功能
    
    // FreeRTOS配置
    TaskHandle_t notify_task;        // 通知任务句柄
    uint32_t notify_mask;            // 通知掩码
    
    // 缓冲区配置
    uint8_t *rx_buffer;              // DMA接收缓冲区
    uint32_t rx_buffer_size;         // 接收缓冲区大小
} uart_dma_config_t;

// 串口驱动句柄
typedef struct {
    uart_dma_config_t config;        // 配置参数
    UART_HandleTypeDef huart;        // HAL UART句柄
    DMA_HandleTypeDef hdma_rx;       // RX DMA句柄
    DMA_HandleTypeDef hdma_tx;       // TX DMA句柄
    SemaphoreHandle_t tx_semaphore;  // 发送信号量
    ring_buffer_t rx_ring_buffer;    // 接收环形缓冲区
    uint32_t dma_rx_last_pos;        // DMA最后位置
    bool initialized;                // 初始化标志
} uart_dma_handle_t;

// 错误码定义
typedef enum {
    USART_DMA_OK = 0,
    USART_DMA_ERROR,
    USART_DMA_BUSY,
    USART_DMA_TIMEOUT,
    USART_DMA_INVALID_PARAM
} usart_dma_status_t;

// 函数声明
// 环形缓冲区操作
void ring_buffer_init(ring_buffer_t *rb, uint8_t *buffer, uint32_t size);
bool ring_buffer_put(ring_buffer_t *rb, uint8_t data);
bool ring_buffer_get(ring_buffer_t *rb, uint8_t *data);
uint32_t ring_buffer_count(ring_buffer_t *rb);

// USART驱动接口
usart_dma_status_t usart_dma_init(uart_dma_handle_t *handle);
usart_dma_status_t usart_dma_deinit(uart_dma_handle_t *handle);
usart_dma_status_t usart_dma_send(uart_dma_handle_t *handle, const uint8_t *data, uint32_t length, uint32_t timeout);
uint32_t usart_dma_read(uart_dma_handle_t *handle, uint8_t *buffer, uint32_t max_length);
uint32_t usart_dma_get_rx_count(uart_dma_handle_t *handle);
void usart_dma_clear_rx_buffer(uart_dma_handle_t *handle);

// 中断处理函数（需要在外部调用）
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
void USART3_IRQHandler(void);
void UART4_IRQHandler(void);
void UART5_IRQHandler(void);
void USART6_IRQHandler(void);
void DMA2_Stream2_IRQHandler(void);
void DMA2_Stream7_IRQHandler(void);

// 获取默认配置
void usart_dma_get_default_config(uart_dma_config_t *config, USART_TypeDef *usart_instance);

#ifdef __cplusplus
}
#endif

#endif /* __USART_DMA_H__ */
